### Progetto 28 Cancello Intelligente **1. Descrizione** Il cancello intelligente è un sistema di parcheggio intelligente che integra MCU e sensore a ultrasuoni, il quale controlla automaticamente il cancello in base alla distanza delle auto, per gestire meglio l’accesso dei veicoli. Quando viene raggiunta una certa distanza, la MCU riceve il segnale dal sensore e stima la distanza tramite l’intensità del segnale. Se l’auto si sta avvicinando o allontanando, la MCU aprirà o chiuderà il cancello tramite un servo. **2. Diagramma di flusso** ![](media/B39.png) **3. Schema di collegamento** ![](media/B40.png) **4. Codice di test** ``` /* keyestudio ESP32 Inventor Learning Kit Project 28 Intelligent Gate http://www.keyestudio.com */ #define servo_pin 25 int distance = 0; //Define a variable to receive the distance int EchoPin = 14; //Connect Echo pin to IO14 int TrigPin = 13; //Connect Trig pin to IO13 //Ultrasonic ranging program float checkdistance() { //Acquire distance //preserve a short low level to ensure a clear high pulse: digitalWrite(TrigPin, LOW); delayMicroseconds(2); //Trigger the sensor by a high pulse of 10um or longer digitalWrite(TrigPin, HIGH); delayMicroseconds(10); digitalWrite(TrigPin, LOW); //Read the signal from the sensor: a high level pulse //Duration is detected from the point sending "ping" command to the time receiving echo signal (unit: um). float distance = pulseIn(EchoPin, HIGH) / 58.00; //Convert into distance delay(10); return distance; } //Servo rotation program void Set_Angle(int angle_val) //Impulse function { int pulsewidth = map(angle_val, 0, 180, 500, 2500); //Map Angle to pulse width for (int i = 0; i < 10; i++) { //Output a few more pulses digitalWrite(servo_pin, HIGH);//Set the servo interface level to high delayMicroseconds(pulsewidth);//The number of microseconds of delayed pulse width value digitalWrite(servo_pin, LOW);//Lower the level of servo interface delay(20 - pulsewidth / 1000); //Add the bracket } } void setup() { // put your setup code here, to run once: pinMode(servo_pin,OUTPUT); pinMode(TrigPin, OUTPUT);//Set Trig pin to output pinMode(EchoPin, INPUT); //Set Echo pin to input } void loop() { // put your main code here, to run repeatedly: distance = checkdistance(); Serial.println(); if(distance < 30) { Set_Angle(180); delay(5000);//Wait for 5s } if(distance > 30) { Set_Angle(0); } } ``` **5. Risultato del test** Dopo aver collegato i cavi e caricato il codice, il servo ruoterà a 180° per 5 secondi se la distanza rilevata è inferiore a 30 cm. Al contrario, il servo ruoterà a 0°.